package com.young.modbus;

import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusSlaveSet;
import com.serotonin.modbus4j.ip.tcp.TcpSlave;

/**
 * @className: ModbusTCPSlave
 * @author: Young
 * @date: 2025/5/26 20:55
 * @Version: 1.0
 * @description:
 */
public class ModbusTCPSlave {

    public static void main(String[] args) throws Exception {
        run();
    }

    public static void run() throws Exception {
        /* createSlave方法执行完成后，会进行监听，影响之后的业务运行，需要以线程的方式进行启动 */
        new Thread(() -> {
            createSalve();
        }).start();
        /* 为保证在进行点表数据初始化的时候slave已经启动完成，在此处进行了1s的休眠 */
        Thread.sleep(1000);
        /* 开始进行点表的初始化数据写入 */
        // InitModbusSlave();
    }

    /**
     * @description 创建ModbusTCP服务器
     */
    private static void createSalve() {
        //创建modbus工厂
        ModbusFactory modbusFactory = new ModbusFactory();
        //创建TCP服务端
        // final ModbusSlaveSet salve = modbusFactory.createTcpSlave(false);
        final ModbusSlaveSet salve = new TcpSlave(10000, false);

        //向过程影像区添加数据
        salve.addProcessImage(Register.getModscanProcessImage(1));
        //获取寄存器
        salve.getProcessImage(1);
        try {
            salve.start();
            System.out.println("salve.start();");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    // /**
    //  * @description 初始化modbusSlave数据
    //  */
    // private void InitModbusSlave(){
    // 	/* 获取联动Mapper */
    //     FamsControlMapper famsControlMapper = SpringUtils.getBean(FamsControlMapper.class);
    // 	/* 查询数据库中最近一次的联动信息 */
    //     List<FamsControl> famsControlList = famsControlMapper.selectNewestControlInfo();
    // 	/* 获取联动序号 */
    //     int serial = famsControlList.get(0).getSerial();
    //
    // 	/* 计算联动序号的高低位 */
    //     short serialHigh = (short) ((serial & 0xffff0000) >> 16);
    //     short serialLow = (short) (serial & 0xffff);
    //
    // 	/* 初始化联动序号写入数组，并赋值*/
    //     short[] serialArray = new short[2];
    //     serialArray[0] = serialHigh;
    //     serialArray[1] = serialLow;
    //
    // 	/* 向点表中写入联动序号 */
    //     try{
    //         ModbusTCPMaster.writeRegisters(1, 0, serialArray);
    //     }catch (Exception e){
    //         LogUtil.info("ModbusTCPSlave::InitModbusSlave - Local initialization information data defeat in modbusTCPSlave"+"(0x000001)");
    //     }
    //
    // 	/* 初始化轮廓数据、目标曲线数据、移架目标数据 */
    //     short[] last = new short[famsControlList.size()];
    //     short[] target = new short[famsControlList.size()];
    //     short[] move = new short[famsControlList.size()];
    //
    // 	/* 将查询到的数据赋值给轮廓、目标、移架数组 */
    //     for(int i = 0; i < famsControlList.size(); i++){
    //         last[i] = (short)(famsControlList.get(i).getLast() & 0xffff);
    //         target[i] = (short)(famsControlList.get(i).getNext() & 0xffff);
    //         move[i] = (short)(famsControlList.get(i).getMove() & 0xffff);
    //     }
    //
    // 	/* 将数据写入到点表中 */
    //     try{
    //         ModbusTCPMaster.writeRegisters(1, 3, last);
    //         ModbusTCPMaster.writeRegisters(1, 204, target);
    //         ModbusTCPMaster.writeRegisters(1, 405, move);
    //     }catch (Exception e){
    //         LogUtil.info("ModbusTCPSlave::InitModbusSlave - Error occured when writing control data."+"(0x000001)");
    //     }
    //
    // 	/* 定义数据正常状态数据 */
    //     short[] done = {0};
    //     try{
    // 		/* 将轮廓曲线、目标曲线、移架目标的数据状态设置为正常 */
    //         ModbusTCPMaster.writeRegisters(1, 0, done);
    //         ModbusTCPMaster.writeRegisters(1, 203, done);
    //         ModbusTCPMaster.writeRegisters(1, 404, done);
    //     }catch (Exception e){
    //         LogUtil.info("ModbusTCPSlave::InitModbusSlave - Error occured when writing serial."+"(0x000001)");
    //     }
    // }
}
